gRPC使用TLS

gRPC使用TLS介绍。

maven的POM设置见gRPC简介

不使用TLS

不使用TLS的话,服务器端只要创建好server就行了:

1
2
3
4
server = NettyServerBuilder.forPort(port)
.addService(UserServiceGrpc.bindService(new UserServiceImpl()))
.build()
.start();

客户端创建channel和stub,

1
2
3
4
5
6
channel = NettyChannelBuilder.forAddress(host, port)
.negotiationType(NegotiationType.PLAINTEXT)
.build();

blockingStub = UserServiceGrpc.newBlockingStub(channel);
asyncStub = UserServiceGrpc.newStub(channel);

然后运行mvn clean compilemvn exec:java -Dexec.mainClass="com.taobao.user.UserServiceServer"启动服务器.

运行mvn exec:java -Dexec.mainClass="com.taobao.user.UserServiceClient"运行客户端.

使用TLS

使用TLS,需要证书,这里使用了gRPC的interop-testing模块下的例子中的证书.

服务器端的channel创建比之前不使用TLS的时候要复杂一些.

1
2
3
4
5
SslContext sslContext = GrpcSslContexts.forServer(Util.loadCert("server1.pem"), Util.loadCert("server1.key")).build();
server = NettyServerBuilder.forPort(port)
.sslContext(sslContext)
.addService(UserServiceGrpc.bindService(new UserServiceImpl()))
.build().start();

客户端的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SslContext sslContext;
try {
sslContext = GrpcSslContexts.forClient().trustManager(Util.loadCert("ca.pem")).build();
} catch (IOException e) {
throw new RuntimeException(e);
}

InetAddress address = InetAddress.getByName(host);
address = InetAddress.getByAddress("foo.test.google.fr", address.getAddress()); // *.test.google.fr

channel = NettyChannelBuilder.forAddress(new InetSocketAddress(address, port))
.negotiationType(NegotiationType.TLS)
.sslContext(sslContext)
.build();

TLS

运行

1
mvn exec:exec --Dexec.executable="java" -Dexec.args=" -Xbootclasspath/p:D:/maven_lib/org/mortbay/jetty/alpn/alpn-boot/8.1.3.v20150130/alpn-boot-8.1.3.v20150130.jar -cp %classpath com.taobao.user.UserServiceServer"

来启动服务器.

运行

1
mvn exec:exec -Dexec.executable="java" -Dexec.args=" -Xbootclasspath/p:D:/maven_lib/org/mortbay/jetty/alpn/alpn-boot/8.1.3.v20150130/alpn-boot-8.1.3.v20150130.jar -cp %classpath com.taobao.user.UserServiceClient"

来运行客户端.

由于Java没有对ALPN的内置支持,所以需要使用外面扩展来使用ALPN,这里使用jetty-ALPN来扩展.所有在启动的使用要加上这样的参数:

1
-Xbootclasspath/p:D:/maven_lib/org/mortbay/jetty/alpn/alpn-boot/8.1.3.v20150130/alpn-boot-8.1.3.v20150130.jar